const { Model, DataTypes } = require('sequelize');
const bcrypt = require('bcryptjs');

// 导出初始化函数
module.exports = (sequelize) => {
    class User extends Model {
        // 实例方法：比较密码
        async comparePassword(candidatePassword) {
            return await bcrypt.compare(candidatePassword, this.password);
        }

        // 实例方法：获取全名
        getFullName() {
            return `${this.firstName} ${this.lastName}`;
        }

        // 隐藏密码字段
        toJSON() {
            const values = { ...this.get() };
            delete values.password;
            return values;
        }
    }

    // 初始化模型
    User.init({
        id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        username: {
            type: DataTypes.STRING(50),
            allowNull: false,
            unique: true,
            validate: {
                notEmpty: {
                    msg: '用户名不能为空'
                },
                len: {
                    args: [3, 50],
                    msg: '用户名长度必须在3-50个字符之间'
                }
            }
        },
        email: {
            type: DataTypes.STRING(100),
            allowNull: false,
            unique: true,
            validate: {
                isEmail: {
                    msg: '请输入有效的邮箱地址'
                }
            }
        },
        password: {
            type: DataTypes.STRING(100),
            allowNull: false,
            validate: {
                notEmpty: {
                    msg: '密码不能为空'
                },
                len: {
                    args: [6, 100],
                    msg: '密码长度必须在6-100个字符之间'
                }
            }
        },
        firstName: {
            type: DataTypes.STRING(50),
            allowNull: false,
            validate: {
                notEmpty: {
                    msg: '名字不能为空'
                },
                len: {
                    args: [1, 50],
                    msg: '名字长度必须在1-50个字符之间'
                }
            }
        },
        lastName: {
            type: DataTypes.STRING(50),
            allowNull: false,
            validate: {
                notEmpty: {
                    msg: '姓氏不能为空'
                },
                len: {
                    args: [1, 50],
                    msg: '姓氏长度必须在1-50个字符之间'
                }
            }
        },
        phone: {
            type: DataTypes.STRING(20),
            allowNull: true,
            validate: {
                is: {
                    args: [/^[\d\s\-\+\(\)]+$/],
                    msg: '请输入有效的电话号码'
                }
            }
        },
        avatar: {
            type: DataTypes.STRING(255),
            allowNull: true
        },
        role: {
            type: DataTypes.ENUM('customer', 'admin'),
            defaultValue: 'customer'
        },
        isActive: {
            type: DataTypes.BOOLEAN,
            defaultValue: true
        },
        lastLoginAt: {
            type: DataTypes.DATE,
            allowNull: true
        }
    }, {
        sequelize,
        modelName: 'User',
        tableName: 'users',
        timestamps: true,
        indexes: [
            {
                unique: true,
                fields: ['email']
            }
        ],
        hooks: {
            // 在创建用户之前加密密码
            beforeCreate: async (user) => {
                if (user.password) {
                    const salt = await bcrypt.genSalt(10);
                    user.password = await bcrypt.hash(user.password, salt);
                }
            },
            // 在更新用户密码时重新加密
            beforeUpdate: async (user) => {
                if (user.changed('password')) {
                    const salt = await bcrypt.genSalt(10);
                    user.password = await bcrypt.hash(user.password, salt);
                }
            }
        }
    });

    return User;
};